/*
@Time : 2022/7/14 19:23
@Author : gaozhichang
@File : atomic.go
@des:
原子操作
根据笔者的个人实践，atomic.Value 对于内存维护，定期更新的静态数据读取是绝佳的场景，建议看看 官方文档提供的 Copy On Write 实现。
*/
package main

import (
	"fmt"
	"sync"
	"sync/atomic"
)

/**
根据笔者的个人实践，atomic.Value 对于内存维护，定期更新的静态数据读取是绝佳的场景，建议看看 官方文档提供的 Copy On Write 实现。
*/
func main() {
	type Map map[string]string
	var m atomic.Value
	m.Store(make(Map))
	var mu sync.Mutex
	read := func(key string) (val string) {
		m1 := m.Load().(Map)
		return m1[key]
	}

	insert := func(key, val string) {
		mu.Lock()
		defer mu.Unlock()
		m1 := m.Load().(Map)
		m2 := make(Map)
		for k, v := range m1 {
			m2[k] = v
		}
		m2[key] = val
		m.Store(m2)
	}

	insert("a","1111")
	res:= read("a")
	fmt.Println(fmt.Sprintf("%v,%T", res, res))

}
